{{tag>Dapper Edgy Feisty compilation programmation}}
----

====== Débuggage avec gdb ======

===== Description =====
gdb, acronyme de GNU DeBugger, est un programme qui, comme son nom l'indique, permet de débugger un programme. Il permet donc de traquer les bugs/erreurs se trouvant dans tout programme.

Cet outil, indispensable à tout programmeur, bien que très performant n'est disponible qu'avec une interface en ligne de commande. Heureusement, il existe des interfaces graphiques qui facilitent le débuggage.


===== Installation =====
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]] [[apt://build-essential gdb|{{apt.png}}]].

Si vous développez en utilisant une bibliothèque particulière, vous pouvez éventuellement installer le paquet de débuggage, dont le nom finit par **-dbg**, en plus du paquet de développement (dont le nom finit par **-dev**).

===== Utilisation basique =====

==== Compilation du programme pour le débuggage ====
Pour que gdb puisse débugger un programme, il a besoin des informations de débuggage, qui peuvent être ajoutées en ajoutant l'option **-g** au compilateur.

Exemple :
<code>gcc -g toto.c -o toto</code>

==== Lancement de gdb ====
Un fois le programme compilé, invoquez gdb comme ceci :

<code>gdb toto</code>

Dans l'interface de gdb, vous pouvez lancer le programme avec **run** et quitter le débogueur avec **quit**.
À tout moment, vous pouvez interrompre le programme avec le raccourci clavier **Ctrl+C** dans le terminal. La commande **where** vous permettra alors de voir la pile des appels.
Pour reprendre l'exécution du programme, tapez **continue**.

Si vous souhaitez changer l'exécutable ciblé par gdb, **exec monexecutable** peut vous être utile.


===== Utilisation avancée =====

==== Placer des points d'arrêt (breakpoints) ====

Si vous soupçonnez une fonction particulière de faire bugger votre programme, vous pouvez placer un //breakpoint// (point d'arrêt) avant le lancement de cette fonction. Pour ce faire, utilisez la commande **break mafonction** (sans les parenthèses).

Si la fonction désirée est située dans une classe ou un //namespace// (espace de noms) **niveau_englobant**, elle est accessible depuis **niveau_englobant::mafonction**.

Pour afficher la liste des points d'arrêt, utilisez **info breakpoints**. Vous remarquerez que chaque point d'arrêt est identifié par un numéro :
<code>(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08049850 in thor::GameApp::catchEvents()
                                       at src/gameapp.cpp:104</code>
Ici, il a pour identifiant 1. S'il ne vous intéresse plus, vous pouvez le supprimer avec la commande **delete 1**.

==== Afficher la valeur d'une variable ====

Il est possible d'afficher la valeur d'une variable une fois que le programme a été interrompu, grâce à la commande **print mavariable**. La même remarque concernant les classes et les espaces de nom s'applique ici.

===== Interfaces graphiques =====

Il existe de multiples interfaces graphiques pour gdb qui facilitent grandement le débuggage en affichant le code source, créant des schémas représentant les variables, etc. En voici quelques-unes :

   * Nemiver: interface de gdb s'intégrant bien à Gnome
   * Kdbg: interface de gdb s'intégrant bien à KDE
   * ddd: interface graphique très complète pour de nombreux debuggers dont gdb
   * xxgdb: interface de gdb pour X
   * cgdb: interface de type ncurses
   * gdb-mode pour emacs

Aussi, quelques environnements de développement incluent une interface graphique pour **gdb** ; c'est le cas d'[[:anjuta|Anjuta]], d'[[:eclipse|Eclipse]] ou encore de [[:kdevelop|KDevelop]].

===== Liens =====
   * [[http://sourceware.org/gdb/documentation/|La documentation officielle]]
   * [[http://www.linux-france.org/article/devl/gdb_howto.html|Un tutorial]]
   * [[http://www.gnu.org/software/ddd/|Le site de ddd]]
   * [[http://cgdb.sourceforge.net/|Le site de cgdb]]
   * [[http://www.linux-france.org/article/devl/gdb.html|Utilisation de gdb-mode]]
   * [[http://refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf|Carte de référence]]